﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using SemWeb;
using SOM.AbstractDALFactory;
using SOM.ConcreteDAL;
using SOM.ConcreteDALFactory;
using SOM.Model;
using SOM.Common;
using RdfXmlWriter = SemWeb.RdfXmlWriter;
using StringWriter = System.IO.StringWriter;

namespace SOM.GeradorMetadados
{
    public class GeradorMetadados
    {
        private SOMAbstractDALFactory _factory;
        public GeradorMetadados()
        {
            _factory = new SOMConcreteDALFactory();
        }
        /// <summary>
        /// Gera o metadado de uma instituição
        /// </summary>
        /// <param name="cnpj"></param>
        /// <returns></returns>
        public string GerarMetadadoReclamacao(string cnpj)
        {
            ReclamacaoDAL reclamacaoDAL = _factory.CreateReclamacaoDAL();
            InstituicaoDAL instituicaoDAL = _factory.CreateInstituicaoDAL();

            Instituicao instituicao = instituicaoDAL.FindByCnpj(cnpj);

            List<Reclamacao> reclamacoesInstituicao = reclamacaoDAL.FindByInstituicao(cnpj);

            if (reclamacoesInstituicao == null)
                throw new ApplicationException("Nenhuma reclamação encontrada para essa instituição.");

            MemoryStore memoryStore = new MemoryStore();

            foreach (Reclamacao rec in reclamacoesInstituicao)
            {
                string reclamacaoNamespace = Constantes.URISOMPROJECT + "reclamacao#";

                //Sujeito
                string reclamacao = Constantes.URISOMPROJECT + "ReclamacaoDetalhes.aspx?op=1&recId=" + rec.rec_id_reclamacao;
    
                Entity publicadaPor = new Entity(reclamacaoNamespace + "publicadaPor");
                Statement statementPublicador = new Statement(reclamacao, publicadaPor, (Literal)rec.usr_usuario.usr_ds_nickname);
                memoryStore.Add(statementPublicador);

                Entity publicadaEm = new Entity(reclamacaoNamespace + "publicadaEm");
                Statement statementDataPublicacao = new Statement(reclamacao, publicadaEm, (Literal)rec.rec_dt_data.ToString());
                memoryStore.Add(statementDataPublicacao);

                Entity descritaComo = new Entity(reclamacaoNamespace + "descritaComo");
                Statement statementDescricao = new Statement(reclamacao, descritaComo, (Literal)rec.rec_ds_reclamacao);
                memoryStore.Add(statementDescricao);

                Entity possuiStatus = new Entity(reclamacaoNamespace + "possuiStatus");
                string statusReclamacao = ((Common.StatusDaReclamacao)rec.rec_id_status).ToString();
                Statement statementeStatus = new Statement(reclamacao, possuiStatus, (Literal)statusReclamacao);
                memoryStore.Add(statementeStatus);

                if (rec.vdo_video != null)
                {
                    Entity ligadaComVideo = new Entity(reclamacaoNamespace + "ligadaComVideo");
                    Statement statementVideo = new Statement(reclamacao, ligadaComVideo, (Literal)rec.vdo_video.vdo_ds_url);
                    memoryStore.Add(statementVideo);
                }

                if (rec.img_imagem != null)
                {
                    Entity ligadaComAlbum = new Entity(reclamacaoNamespace + "ligadaComAlbum");
                    Statement statementAlbum = new Statement(reclamacao, ligadaComAlbum, (Literal)rec.img_imagem.img_ds_url);
                    memoryStore.Add(statementAlbum);
                }
                
                if (rec.loc_localizacao != null)
                {
                    Entity localizadaEm = new Entity(reclamacaoNamespace + "localizadaEm");
                    Statement statementLocalizada = new Statement(reclamacao, localizadaEm, (Literal)(rec.loc_localizacao.loc_ds_latitude + ";" + rec.loc_localizacao.loc_ds_longitude));
                    memoryStore.Add(statementLocalizada);
                } 
            }

            StringWriter stringWriter = new StringWriter();
            using (RdfWriter rdfWriter = new RdfXmlWriter(stringWriter))
            {
                rdfWriter.Write(memoryStore);
            }

            return stringWriter.ToString();
        }
    }
}
